# -*- coding: utf-8-sig -*-

# Create your views here.
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.shortcuts import get_object_or_404, render_to_response
from django.template import Context, loader
from django.core.context_processors import csrf
from django.template import RequestContext
from grids import *

# Se importan los modelos para la BD
from core.models import Deporte, Atleta
from core.XMLParser import *

@login_required
def index(request):
    deportes = Deporte.objects.all()
    return render_to_response('deportes/index.html',
    {'deportes':deportes, 'user_logged_in':request.user.is_authenticated()},
    context_instance=RequestContext(request))

@login_required
def ver(request, id_deporte):
    dep  = Deporte.objects.get(pk=id_deporte) if id_deporte != None else None
    deporte = dep.getXMLObject()
    '''
    deporte = XMLDeporte()
    deporte.nombre = 'Deporte hardcoeado: Natación'
    deporte.datos_requeridos = ['nombres','apellidos']
    disc1 = XMLDisciplina(nombre='discá1',deporte=deporte)
    disc1.tipo_resultado = 'tiempo'
    disc2 = XMLDisciplina(nombre='disc2',deporte=deporte)
    
    deporte.disciplinas.append(disc1)
    deporte.disciplinas.append(disc2)
    
    disc2.tipo_resultado = 'puntos'
    cat1 = XMLCategoria(nombre='cat11',disciplina=disc1)
    cat2 = XMLCategoria(nombre='cat12',disciplina=disc1)
    cat3 = XMLCategoria(nombre='cat21',disciplina=disc2)
    cat4 = XMLCategoria(nombre='cat22',disciplina=disc2)
    
    disc1.categorias.append(cat1)
    disc1.categorias.append(cat2)
    disc2.categorias.append(cat3)
    disc2.categorias.append(cat4)
    '''
    datos_requeridos = [a for a in deporte.datos_requeridos]
    
    cant_req = len(deporte.datos_requeridos)
    cant_disc = len(deporte.disciplinas)
    cant_federados = len(dep.atleta_set.all())
    return render_to_response('deportes/ver.html',
    {'deporte':deporte,
        'cant_federados':cant_federados,
        'cant_req':cant_req,
        'cant_disc':cant_disc,
        'datos_requeridos':datos_requeridos,
        'id':dep.id,
        'user_logged_in':request.user.is_authenticated()
    },
    context_instance=RequestContext(request))

@login_required
def editar(request, id_deporte):
    deporte = Deporte.objects.get(pk=id_deporte) if id_deporte != None else None
    xml = deporte.getXMLObject()
    datos = Atleta.attr_dict()
    
    return render_to_response('deportes/formulario.html',
        {
            'deporte':deporte,
            'xml':xml,
            'datos':Atleta.attr_dict(),
            'next':'../../guardar_cambios/' + id_deporte + '/',
            'action':'Guardar Edición',
            'user_logged_in':request.user.is_authenticated()
        },
        context_instance=RequestContext(request))


@login_required
def nuevo(request):
    datos = Atleta.attr_dict()
    return render_to_response('deportes/formulario.html',{'datos':datos, 'next':'../crear/','action':'Crear deporte', 'user_logged_in':request.user.is_authenticated()}, context_instance=RequestContext(request))

@login_required
def crear(request):
    # Métodos utilitarios    
    def contains(lista,elemento):
        for i in lista:
            if elemento == i:
                return True
        return False
    def contains_by_name(lista, elemento):
        for i in lista:
            if i[0] == elemento[0]:
                return True
        return False
    
        #~ cadena = ''
        #~ for key in request.POST:
                #~ cadena = cadena + key + '=' + request.POST[key] + '<br/>'
        
        # Inicializa las variables con las que se va a trabajar.
        
    deporte = Deporte()
    xml = XMLDeporte()
    errores = []
    advertencias = []
    
    # Obtiene el nombre del deporte
    
    if request.POST['nombreDeporte'] == '':
        errores.append('Debe ingresar un nombre para el deporte.')
    else:
        deporte.nombre = request.POST['nombreDeporte']
        if Deporte.objects.filter(nombre=deporte.nombre):
            errores.append('Ya hay un deporte con el nombre "' + deporte.nombre + '" en la base de datos.')
    
    # Obtiene los datos requeridos. 
    
    cantidad_datos_requeridos = int(request.POST['DRLen'])
    datos_requeridos = []
    for i in range(cantidad_datos_requeridos):
        dr = request.POST['nombreDR'+str(i)]
        if contains(datos_requeridos, dr):
            advertencias.append('El dato requerido "' + dr + '" se encuentra duplicado. S&oacute;lo se ingresar&aacute; una vez.')
        else:
            datos_requeridos.append(dr)
    
    # Parsea las disciplinas una por una.
    cantidad_disciplinas = int(request.POST['DisLen'])
    disciplinas = []
    for i in range(cantidad_disciplinas):
        nombre_disciplina = request.POST['nombreDisciplina'+str(i)]
        if nombre_disciplina == '':
            errores.append('Debe ingresar un nombre para la disciplina ' + str(i+1) +'.')

        tipo_de_resultado = request.POST['tipoResultado'+str(i)]
        
        # Verifica si la categoria divide por sexo.
        sexo = True
        try:
            request.POST['sexoDisciplina'+str(i)]
        except:
            sexo = False
        
        # Verifica si la categoria divide por edad.
        edad = True
        try:
            request.POST['edadDisciplina'+str(i)]
        except:
            edad = False
            
        # Verifica si la categoria divide por peso.
        peso = True
        try:
            request.POST['pesoDisciplina'+str(i)]
        except:
            peso = False
        
        # Parsea las categorias de cada disciplina
        cantidad_categorias = int(request.POST['CatLen'+str(i)])
        categorias = []
        for j in range(cantidad_categorias):
            nombre_categoria = request.POST['nombreCategoria'+str(i)+"-"+str(j)]
            sexo_categoria = None
            if sexo:
                sexo_categoria = request.POST['sex'+str(i)+"-"+str(j)]
            
            edad_min_categoria = None
            edad_max_categoria = None
            nombre_edad_categoria = None
            if edad:
                edad_min_categoria = request.POST['edadMinima'+str(i)+"-"+str(j)]
                edad_max_categoria = request.POST['edadMaxima'+str(i)+"-"+str(j)]
                nombre_edad_categoria = request.POST['nombreEdad'+str(i)+"-"+str(j)]
                if edad_max_categoria < edad_min_categoria:
                    errores.append('La edad m&aacute;xima debe ser mayor a la edad m&iacute;nima en la categor&iacute;a ' + str(j+1) + ' de la disciplina ' + str(i+1) + '.')
            
            peso_min_categoria = None
            peso_max_categoria = None
            dimensional_peso_categoria = None
            nombre_peso_categoria = None
            if peso:
                peso_min_categoria = request.POST['pesoMinimo'+str(i)+"-"+str(j)]
                peso_max_categoria = request.POST['pesoMaximo'+str(i)+"-"+str(j)]
                dimensional_peso_categoria = request.POST['dimensional'+str(i)+"-"+str(j)]
                nombre_peso_categoria = request.POST['NombrePeso'+str(i)+"-"+str(j)]
                if peso_max_categoria < peso_min_categoria:
                    errores.append('El peso m&aacute;ximo debe ser mayor al peso m&iacute;nimo en la categor&iacute;a' + str(j+1) + ' de la disciplina ' + str(i+1) + '.')
            
            categoria = (nombre_categoria, sexo_categoria, edad_min_categoria, edad_max_categoria, nombre_edad_categoria, peso_min_categoria, peso_max_categoria, dimensional_peso_categoria, nombre_peso_categoria)
            if contains(categorias,categoria):
                advertencias.append('La categor&iacute;a ' + str(j+1) + ' de la disciplina ' + str(i+1) + ' se encuentra repetida. Se almacenar&aacute; &uacute;nicamente una vez.')
            else:
                categorias.append(categoria)
        
        disciplina = (nombre_disciplina, tipo_de_resultado, categorias)
        if contains_by_name(disciplinas, disciplina):
            errores.append('Hay dos disciplinas con el nombre "' + nombre_disciplina + '".')
        #~ else:
        disciplinas.append(disciplina)
    
    # Si no hay ningún error, se procede a almacenar en la base de datos (finalmente...)
    xml.nombre = deporte.nombre
    xml.datos_requeridos = datos_requeridos
    for disciplina in disciplinas:
        xml_disciplina = XMLDisciplina()
        xml_disciplina.nombre = disciplina[0]
        xml_disciplina.tipo_resultado = disciplina[1]
        xml_disciplina.tiene_sexo = disciplina[2][0][1] != None # La categoría tiene sexo si el atributo sexo de la categoría no es None.
        xml_disciplina.tiene_edad = disciplina[2][0][2] != None # De manera similar con la edad
        xml_disciplina.tiene_peso = disciplina[2][0][5] != None # y con el peso.
        for categoria in disciplina[2]:
            xml_categoria = XMLCategoria()
            xml_categoria.nombre = categoria[0]
            if xml_disciplina.tiene_sexo:
                xml_categoria.sexo = categoria[1]
            if xml_disciplina.tiene_edad:
                xml_edad = XMLEdad()
                xml_edad.min = categoria[2]
                xml_edad.max = categoria[3]
                xml_edad.nombre = categoria[4]
                xml_categoria.edad = xml_edad
            if xml_disciplina.tiene_peso:
                xml_peso = XMLPeso()
                xml_peso.min = categoria[5]
                xml_peso.max = categoria[6]
                xml_peso.dimensiona = categoria[7]
                xml_peso.nombre = categoria[-1]
                xml_categoria.peso = xml_peso
            xml_disciplina.categorias.append(xml_categoria)
        xml.disciplinas.append(xml_disciplina)
    #deporte.xml = xml_generador([xml])

    if len(errores) == 0 and len(advertencias) == 0:
        deporte.save()
        xml.setId(deporte.pk)
        deporte.xml = xml_generador([xml])
        deporte.save()
        #id = Deporte.objects.filter(nombre=deporte.nombre)[0].id
        return HttpResponseRedirect(reverse('deportes.views.ver', args=(deporte.pk,)))
    else:
        return render_to_response('deportes/formulario.html',
        {
            'errores':errores,
            'advertencias':advertencias,
            'deporte':deporte,
            'xml':xml,
            'datos':Atleta.attr_dict(),
            'next':'../crear/',
            'action':'Crear Deporte',
            'user_logged_in':request.user.is_authenticated()
        },
        context_instance=RequestContext(request))

@login_required
def guardar_cambios(request, id_deporte):
    # Métodos utilitarios    
    def contains(lista,elemento):
        for i in lista:
            if elemento == i:
                return True
        return False
    def contains_by_name(lista, elemento):
        for i in lista:
            if i[0] == elemento[0]:
                return True
        return False
    
        #~ cadena = ''
        #~ for key in request.POST:
                #~ cadena = cadena + key + '=' + request.POST[key] + '<br/>'
        
        # Inicializa las variables con las que se va a trabajar.
        
    deporte  = Deporte.objects.get(pk=id_deporte) if id_deporte != None else None
    xml = XMLDeporte()
    errores = []
    advertencias = []
    
    # Obtiene el nombre del deporte
    
    #~ if request.POST['nombreDeporte'] == '':
        #~ errores.append('Debe ingresar un nombre para el deporte.')
    #~ else:
        #~ deporte.nombre = request.POST['nombreDeporte']
        #~ if Deporte.objects.filter(nombre=deporte.nombre):
            #~ errores.append('Ya hay un deporte con el nombre "' + deporte.nombre + '" en la base de datos.')
    
    # Obtiene los datos requeridos. 
    
    cantidad_datos_requeridos = int(request.POST['DRLen'])
    datos_requeridos = []
    for i in range(cantidad_datos_requeridos):
        dr = request.POST['nombreDR'+str(i)]
        if contains(datos_requeridos, dr):
            advertencias.append('El dato requerido "' + dr + '" se encuentra duplicado. S&oacute;lo se ingresar&aacute; una vez.')
        else:
            datos_requeridos.append(dr)
    
    # Parsea las disciplinas una por una.
    cantidad_disciplinas = int(request.POST['DisLen'])
    disciplinas = []
    for i in range(cantidad_disciplinas):
        nombre_disciplina = request.POST['nombreDisciplina'+str(i)]
        if nombre_disciplina == '':
            errores.append('Debe ingresar un nombre para la disciplina ' + str(i+1) +'.')

        tipo_de_resultado = request.POST['tipoResultado'+str(i)]
        

        # Verifica si la categoria divide por sexo.
        sexo = True
        try:
            request.POST['sexoDisciplina'+str(i)]
        except:
            sexo = False
        
        # Verifica si la categoria divide por edad.
        edad = True
        try:
            request.POST['edadDisciplina'+str(i)]
        except:
            edad = False
            
        # Verifica si la categoria divide por peso.
        peso = True
        try:
            request.POST['pesoDisciplina'+str(i)]
        except:
            peso = False
        
        # Parsea las categorias de cada disciplina
        cantidad_categorias = int(request.POST['CatLen'+str(i)])
        categorias = []
        for j in range(cantidad_categorias):
            nombre_categoria = request.POST['nombreCategoria'+str(i)+"-"+str(j)]
            sexo_categoria = None
            if sexo:
                sexo_categoria = request.POST['sex'+str(i)+"-"+str(j)]
            
            edad_min_categoria = None
            edad_max_categoria = None
            nombre_edad_categoria = None
            if edad:
                edad_min_categoria = request.POST['edadMinima'+str(i)+"-"+str(j)]
                edad_max_categoria = request.POST['edadMaxima'+str(i)+"-"+str(j)]
                nombre_edad_categoria = request.POST['nombreEdad'+str(i)+"-"+str(j)]
                if edad_max_categoria < edad_min_categoria:
                    errores.append('La edad m&aacute;xima debe ser mayor a la edad m&iacute;nima en la categor&iacute;a ' + str(j+1) + ' de la disciplina ' + str(i+1) + '.')
            
            peso_min_categoria = None
            peso_max_categoria = None
            dimensional_peso_categoria = None
            nombre_peso_categoria = None
            if peso:
                peso_min_categoria = request.POST['pesoMinimo'+str(i)+"-"+str(j)]
                peso_max_categoria = request.POST['pesoMaximo'+str(i)+"-"+str(j)]
                dimensional_peso_categoria = request.POST['dimensional'+str(i)+"-"+str(j)]
                nombre_peso_categoria = request.POST['NombrePeso'+str(i)+"-"+str(j)]
                if peso_max_categoria < peso_min_categoria:
                    errores.append('El peso m&aacute;ximo debe ser mayor al peso m&iacute;nimo en la categor&iacute;a' + str(j+1) + ' de la disciplina ' + str(i+1) + '.')
            
            categoria = (nombre_categoria, sexo_categoria, edad_min_categoria, edad_max_categoria, nombre_edad_categoria, peso_min_categoria, peso_max_categoria, dimensional_peso_categoria, nombre_peso_categoria)
            if contains(categorias,categoria):
                advertencias.append('La categor&iacute;a ' + str(j+1) + ' de la disciplina ' + str(i+1) + ' se encuentra repetida. Se almacenar&aacute; &uacute;nicamente una vez.')
            else:
                categorias.append(categoria)
        
        disciplina = (nombre_disciplina, tipo_de_resultado, categorias)
        if contains_by_name(disciplinas, disciplina):
            errores.append('Hay dos disciplinas con el nombre "' + nombre_disciplina + '".')
        #~ else:
        disciplinas.append(disciplina)
    
    # Si no hay ningún error, se procede a almacenar en la base de datos (finalmente...)
    xml.nombre = deporte.nombre
    xml.datos_requeridos = datos_requeridos

    for disciplina in disciplinas:
        xml_disciplina = XMLDisciplina()
        xml_disciplina.nombre = disciplina[0]
        xml_disciplina.tipo_resultado = disciplina[1]
        xml_disciplina.tiene_sexo = disciplina[2][0][1] != None # La categoría tiene sexo si el atributo sexo de la categoría no es None.
        xml_disciplina.tiene_edad = disciplina[2][0][2] != None # De manera similar con la edad
        xml_disciplina.tiene_peso = disciplina[2][0][5] != None # y con el peso.
        for categoria in disciplina[2]:
            xml_categoria = XMLCategoria()
            xml_categoria.nombre = categoria[0]
            if xml_disciplina.tiene_sexo:
                xml_categoria.sexo = categoria[1]
            if xml_disciplina.tiene_edad:
                xml_edad = XMLEdad()
                xml_edad.min = categoria[2]
                xml_edad.max = categoria[3]
                xml_edad.nombre = categoria[4]
                xml_categoria.edad = xml_edad
            if xml_disciplina.tiene_peso:
                xml_peso = XMLPeso()
                xml_peso.min = categoria[5]
                xml_peso.max = categoria[6]
                xml_peso.dimensiona = categoria[7]
                xml_peso.nombre = categoria[-1]
                xml_categoria.peso = xml_peso
            xml_disciplina.categorias.append(xml_categoria)
        xml.disciplinas.append(xml_disciplina)
    #deporte.xml = xml_generador([xml])
    print xml.nombre
    print len(errores)
    print len(advertencias)
    
    if len(errores) == 0 and len(advertencias) == 0:
        deporte.save()
        xml.setId(deporte.pk)
        deporte.xml = xml_generador([xml])
        deporte.save()
        return HttpResponseRedirect(reverse('deportes.views.ver', args=(id_deporte,)))
    else:
        return render_to_response('deportes/formulario.html',
        {
            'errores':errores,
            'advertencias':advertencias,
            'deporte':deporte,
            'xml':xml,
            'datos':Atleta.attr_dict(),
            'next':'../../guardar_cambios/' + id_deporte + '/',
            'action':'Guardar Cambios',
            'user_logged_in':request.user.is_authenticated()
        },
        context_instance=RequestContext(request))

#~ def eliminar(request, id_deporte):
    #~ deporte = get_object_or_404(Deporte, pk=id_deporte)
    #~ if request.method == 'POST':
        #~ deporte.delete()
        #~ return HttpResponseRedirect(reverse('deportes.views.index'))
    #~ else:
        #~ return HttpResponseRedirect(reverse('deportes.views.ver', args=(deporte.id,)))

@login_required
def grid_handler(request):
    # handles pagination, sorting and searching
    grid = DeportesGrid()
    return HttpResponse(grid.get_json(request), mimetype="application/json")

@login_required
def grid_config(request):
    # build a config suitable to pass to jqgrid constructor   
    grid = DeportesGrid()
    return HttpResponse(grid.get_config(), mimetype="application/json")
    
@login_required
def grid_federados_handler(request,deporte_id):
    # handles pagination, sorting and searching
    grid = FederadosDeportesGrid(deporte_id)
    return HttpResponse(grid.get_json(request), mimetype="application/json")

@login_required
def grid_federados_config(request,deporte_id):
    # build a config suitable to pass to jqgrid constructor   
    grid = FederadosDeportesGrid(deporte_id)
    return HttpResponse(grid.get_config(), mimetype="application/json")

